home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / FPSE_src / debug.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  5KB  |  167 lines

  1. /*
  2.     FPSE debugger
  3.     =============
  4.  
  5.     Written by LDChen
  6. */
  7.  
  8. #include "fpse.h"
  9.  
  10. // Today some commands are not implemented
  11. char *str_hlp = { "r <x> <val> : watch GPR regs and assign new value\n"
  12.                   "c <x>       : watch COP<x>\n"
  13.                   "b <hexadr>  : set breakpoint at hexadr (if no hexadr break is disabled)\n"
  14.                   "g           : go\n"
  15.                   "s           : step\n"
  16.                   "n           : next\n"
  17.                   "<ENTER>     : repeat last command\n"
  18.                   "u <hexadr>  : unassemble at hexadr (if none PC reg is used)\n"
  19.                   "d <hexadr>  : dump data at hexadr (if none PC reg is used)\n"
  20.                   "p <hexadr>  : print portname at hexadr\n"
  21.                   "w <x,hexadr>: write data of type x at hexadr\n"
  22.                   "h           : display this help\n"
  23.                   "q           : quit debugger\n" };
  24.  
  25. extern int dumpreg;
  26.  
  27. void *getaddr(UINT32 adr)
  28. {
  29.     if ((adr>=0x80000000 && adr<0x80800000) ||
  30.         (adr>=0xa0000000 && adr<0xa0800000) ||
  31.         (adr>=0x00000000 && adr<0x00800000)) return ram;
  32.  
  33.     if ((adr>=0xbfc00000 && adr<0xbfc80000) ||
  34.         (adr>=0x1fc00000 && adr<0x1fc80000) ||
  35.         (adr>=0x9fc00000 && adr<0x9fc80000)) return rom;
  36.  
  37.     if (adr>=0x1f000000 && adr<0x1f020000) return extrom;
  38.  
  39.     return NULL;
  40. }
  41.  
  42. void run_debug(void)
  43. {
  44.  char   buf[80];
  45.  UINT32 code;
  46.  int    fine=1,ncmd,address,val;
  47.  int    brkadr = 0,brkp=0;
  48.  char   oldcmd=0,cmd;
  49.  
  50.  while (fine)
  51.     {
  52.         FPSE_Flags |= VERBOSE | DISASMFLG;
  53.         printf(">");
  54.         gets(buf);
  55.         ncmd = sscanf(buf,"%c %x %x",&cmd,&address,&val);
  56.         if (!cmd) cmd    = oldcmd;
  57.              else oldcmd = cmd;
  58.  
  59.         switch (cmd) {
  60.         case 'u':
  61.             {
  62.             int x;
  63.             char *y;
  64.             if (ncmd == 1) address = PC;
  65.             y = getaddr(address);
  66.             if (y==NULL) {
  67.                 printf("Unavailable\n");
  68.                 break;
  69.             }
  70.             dumpreg = 0;
  71.             for (x=0;x<16;x++) {
  72.                 code = *(UINT32 *)(y+(address&0x1FFFFF)+x*4);
  73.                 disasm(buf,code,address+x*4);
  74.                 printf("%08x: %08x %s\n",address+x*4,(int)code,buf);
  75.             }
  76.             dumpreg = 1;
  77.             address += 16*4;
  78.             }
  79.             break;
  80.         case 'd':
  81.             {
  82.             int    x,z;
  83.             UINT8 *y;
  84.             if (ncmd == 1) address = PC;
  85.             y = getaddr(address);
  86.             if (y==NULL) {
  87.                 printf("Unavailable\n");
  88.                 break;
  89.             }
  90.             dumpreg = 0;
  91.             y += (address & 0x1FFFFF);
  92.             for (z=0;z<8;z++)
  93.             {
  94.                 printf("%08x: ",address+z*16);
  95.                 for (x=0;x<16;x++)
  96.                     printf("%02x ",*(y+x));
  97.                 for (x=0;x<16;x++)
  98.                     if (y[x] >= 32 && y[x] < 128) printf("%c",y[x]);
  99.                                              else printf(".");
  100.                 printf("\n");
  101.                 y += 16;
  102.             }
  103.             dumpreg = 1;
  104.             address += 16*8;
  105.             }
  106.             break;
  107.         case 'r':
  108.             if (ncmd == 1) {
  109.                 watch(-1);
  110.                 printf("breakpoint: %sable at %08x\n",(brkp)?"en":"dis",brkadr);
  111.                 break;
  112.             }
  113.             if (ncmd == 3) reg.r[address] = val;
  114.             watch(address);
  115.             break;
  116.         case 'c':
  117.             if (ncmd == 1) {
  118.                 watchcop(3);
  119.             } else watchcop(address);
  120.             break;
  121.         case 'g':
  122.             {
  123.             int x;
  124.             FPSE_Flags &= ~(VERBOSE | DISASMFLG);
  125.             while(!stop)
  126.              {
  127.                 if (update_counter()) Interrupt();
  128.                 for (x=0;x<16;x++) {
  129.                     doInst();
  130.                     if (brkp == 1 && PC == brkadr) break;
  131.                 }
  132.                 if (brkp == 1 && PC == brkadr) break;
  133.             }
  134.             if (stop)
  135.             {
  136.                 printf("FATAL ERROR during exe - PC=%08x\n",(int)PC);
  137.                 return;
  138.             }
  139.             }
  140.             break;
  141.         case 's':
  142.             if (update_counter()) Interrupt();
  143.             doInst();
  144.             if (stop) {printf("FATAL ERROR during exe\n"); return; }
  145.             break;
  146.         case 'b':
  147.             if (ncmd<2)
  148.                 {
  149.                     brkp ^= 1;
  150.                     break;
  151.                 }
  152.             brkadr=address;
  153.             brkp = 1;
  154.             break;
  155.         case 'h':
  156.             printf("%s",str_hlp);
  157.             break;
  158.         case 'q':
  159.             fine = 0;
  160.             break;
  161.         default:
  162.             printf("unknow command.\n");
  163.             break;
  164.         }
  165.  
  166.     }
  167. }